package com.guaoran.interview.in2019.compare;

import java.util.*;

/**
 * @Author gucheng
 * @Description 比较测试
 * 2019-09-11 14:03
 */
public class EqualsTest {
    public static void main(String[] args) {
        EqualsDemo demo = createDemo();
        EqualsDemo demo1 = createDemo();
        // 如果改变对象的元素的值，则结果就不相同了。
        // demo1.setName("ls");

        // 当进行 equals 方法比较两个元素的时候， 如果不覆盖，是直接使用的Object 的equals 方法，比较的是首地址
        // 当重写 equals 方法时，我们比较对象的每个元素是否相同。
        System.out.println(demo.equals(demo1));
        System.out.println(demo1.equals(demo));

        // 即：此时我们满足 a.equals(b) == b.equals(a) ,那么我们认为两个对象是相同的。
        // 那么，当存储到hashMap中，是否也应该是同一个元素呢
        // 当进行hashCode 的时候，如果不覆盖，则直接使用的Object 的hashCode 方法。比较的<p>应该</p>也是首地址
        // 当重写了hashCode 的时候，会按照我们自己的比较规则来实现。
        System.out.println(demo.hashCode());
        System.out.println(demo1.hashCode());
        System.out.println(demo.hashCode() == demo1.hashCode());

        // 使用hashMap 当覆盖 hashCode 和不覆盖 hashCode 两种实现
        // 当不覆盖 hashCode的时候，hashMap.put 的时候，会将a.equals(b)==true 的这两个元素认为是不同的元素，两次都是添加，因为hashCode 不同
        // 当重写 hashCode的时候，hashMap.put 的时候，会将a.equals(b)==true 的这两个元素认为是同一个元素，第一次是添加，第二次是覆盖

        HashMap map = new HashMap();
        map.put(demo,"");
        map.put(demo1,"");
        System.out.println(map.size());

        // treeMap 基本类型，因为本身实现了 Comparable 所以正常运行
        Map mapStr = new TreeMap();
        mapStr.put("aaa","");
        mapStr.put("aaa","");
        System.out.println(mapStr.size());

        // 这里实现了 Comparable  或者 直接传实现 所以正常比较，如果不实现，则会报错
        Map treeMap = new TreeMap(new Comparator<EqualsDemo>() {
            @Override
            public int compare(EqualsDemo o1, EqualsDemo o2) {
                return o1.getId().compareTo(o2.getId()) + o1.getName().compareTo(o2.getName()) + o1.getCreateTime().compareTo(o2.getCreateTime());
            }
        });
        treeMap.put(demo,"");
        treeMap.put(demo1,"");
        System.out.println(treeMap.size());

        System.out.println(demo.compareTo(demo1));
    }
    private static EqualsDemo createDemo(){
        EqualsDemo demo = new EqualsDemo();
        demo.setId(1);
        demo.setCreateTime(new Date());
        demo.setName("zs");
        return demo;
    }
}
